﻿using System;
using System.IO;
using System.Windows.Forms;

namespace Administracja
{
    public partial class ZarzadzanieNowa : Form
    {
        private readonly string _nazwaPliku; //plik na podstawie którego generujemy nową

        public ZarzadzanieNowa(string nazwaPliku)
        {
            InitializeComponent();
            _nazwaPliku = nazwaPliku;
            na_podstawie_rad.Text = "Na podstawie: " + nazwaPliku;
        }

        private void AnulujClick(object sender, EventArgs e)
        {
            Close();
        }

        private void ZapiszClick(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(nazwa_box.Text))
            {
                Wyjatki.Komunikat("Musisz podać nazwę pliku.", "Błąd nazwy pliku", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else if (File.Exists("Baza\\" + nazwa_box.Text + ".FDB"))
            {
                Wyjatki.Komunikat("Rok o podanej nazwie już istnieje, wybierz inną.", "Błąd nazwy pliku", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else if (string.Compare(nazwa_box.Text, "PUSTA", true) == 0)
            {
                Wyjatki.Komunikat("Baza o tej nazwie jest bazą systemową i nie możesz zapisać nowego roku pod tą nazwą.", "Błąd nazwy pliku", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                if (na_podstawie_rad.Checked)
                {
                    try
                    {
                        Baza.CloseConnection();

                        File.Copy("Baza\\" + _nazwaPliku, "Baza\\" + nazwa_box.Text + ".FDB");

                        Baza.ConnectionString = nazwa_box.Text + ".FDB";
                        Baza.OpenConnection();

                        foreach (string idO in Baza.Wczytaj1Dp("SELECT ID FROM OSOBY"))
                        {
                            double bilans = Baza.LiczBilansOsob(int.Parse(idO));

                            if (bilans <= 0)
                            {
                                bilans = 0 - bilans;
                                Baza.Zapisz("UPDATE FAKTURY SET SUMA_B = '" + bilans.ToString().Replace(",", ".") + "', OPLATA = '0' WHERE ID_N = '" + idO + "' AND NUMER = '0'");
                            }
                            else
                            {
                                Baza.Zapisz("UPDATE FAKTURY SET SUMA_B = '0', OPLATA = '" + bilans.ToString().Replace(",", ".") + "' WHERE ID_N = '" + idO + "' AND NUMER = '0'");

                                int idF = int.Parse(Baza.Wczytaj("SELECT ID FROM FAKTURY WHERE ID_N = '" + idO + "' AND NUMER = '0'"));

                                Baza.Zapisz("INSERT INTO WPLATY VALUES (GEN_ID(NUMERACJA_WPLATY,1),'" + idF + "','" + DateTime.Now.ToString("dd.MM.yyyy") + "','" +
                                    bilans.ToString().Replace(",", ".") + "','0','G','FV','')");
                            }

                            //Wystawianie faktur za styczeń
                            Baza.Zapisz("UPDATE FAKTURY SET DATA = '10.01.2015' WHERE DATA LIKE '2014-12-%' AND ID_N = '" + idO + "' AND ID_N NOT IN (SELECT ID FROM OSOBY WHERE GRUPA = 4)");
                        }
                        //Usunięcie Faktur_skladników prócz tych wystawionych na nowy rok
                        Baza.Zapisz("DELETE FROM FAKTURY_SKLADNIKI WHERE ID_F NOT IN (SELECT ID FROM FAKTURY WHERE DATA = '10.01.2015')");
                        Baza.Ustaw("FAKTURY_SKLADNIKI");

                        //Usuwanie wpłaty, prócz tych, które zostały ustawione jako nadpłata z poprzedniego roku.
                        Baza.Zapisz("DELETE FROM WPLATY WHERE DATA < '" + DateTime.Now.ToString("dd.MM.yyyy") + "'");
                        Baza.Ustaw("WPLATY");

                        //TODO: Po otwarciu roku faktury wystawione na styczeń mają numery grudniowych
                        //Usunięcie faktur z poprzedniego roku
                        Baza.Zapisz("DELETE FROM FAKTURY WHERE DATA < '01.01." + DateTime.Now.Year + "' AND NUMER <> 0");
                        //Usuwanie osób, które nie miały żadnej faktury prócz bilansu otwarcia.
                        Baza.Zapisz("DELETE FROM FAKTURY WHERE ID_N IN (SELECT ID_N FROM FAKTURY GROUP BY ID_N HAVING COUNT(NUMER) < 2)");
                        //Usuwanie osób, które nie posiadają żadnych faktur, czyli tych którym usuneliśmy bilans i inne faktury wcześniej.
                        Baza.Ustaw("FAKTURY");

                        Baza.Zapisz("DELETE FROM OSOBY WHERE ID NOT IN (SELECT ID_N FROM FAKTURY)");
                        Baza.Ustaw("OSOBY");

                        Baza.Zapisz("DELETE FROM ZAKUPY_SKLADNIKI");
                        Baza.Ustaw("ZAKUPY_SKLADNIKI");

                        Baza.Zapisz("DELETE FROM ZAKUPY WHERE WPLACONA_KWOTA <> '0'");
                        Baza.Ustaw("ZAKUPY");

                        Baza.Zapisz("DELETE FROM SALDA WHERE ID = '0'",
                            "UPDATE SALDA SET ID = '0' WHERE ID IN (SELECT MAX(ID) FROM SALDA)",
                            "DELETE FROM SALDA WHERE ID != '0'");
                        Baza.Ustaw("SALDA");

                        Baza.Zapisz("DELETE FROM INNE_OBROTY");
                        Baza.Ustaw("INNE_OBROTY");
                    }
                    catch (Exception ex)
                    {
                        Wyjatki.Error(ex);
                    }
                }
                else
                {
                    File.Copy("Baza//PUSTA.FDB", "Baza//" + nazwa_box.Text + ".FDB");
                }

                Baza.ZapiszData("INSERT INTO DATA VALUES (GEN_ID(NUMERACJA_DATA,1),'" + nazwa_box.Text + "','"
                     + nazwa_box.Text + ".FDB','T')");

                Close();
            }
        }

        private void NazwaBoxKeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Enter)
            {
                ZapiszClick(this, EventArgs.Empty);
            }
        }
    }
}
